#include "cstatemanager.h"
#include "cstate.h"
#include <iostream>

CStateManager::CStateManager()
{
    currGameState = NULL;
    initialized = false;
}

CStateManager::~CStateManager()
{

}

// Pagrindinis GL inicijavimo metodas. Vykdomas tik 1 KARTĄ, todėl vykdom
//  visų state'ų GL inicijavimo metodus paeiliui.
// PROBLEMA: nežinia kaip dėl vienas kitam prieštaraujančių nustatymų.
//  pvz. nustačius vienam state glClearColor į juodą, o kitam į baltą, abiejuose rodys tą,
//  kuri inicijuota paskutinė (šitą teiginį vis dėl to reiktų ir patikrinti).
// PATARTINA: apibendrintą visiems state konfigūraciją rašyti į šį metodą, o
//  atitinkamus tik state'ams būdingus veiksmus (pvz. tekstūrų įkrovimas) - state'ų initGL metoduose.
void CStateManager::initializeGL()
{
    //if (currGameState != NULL) { currGameState->initGL(this); }
    st_init();
}

// Piešimo metodas
//  Jei yra nustatytas state'as, liepia jam vykdyti jo vidinį piešimo metodą.
//  Perduodam ir pointerį į GL widget'ą, kad būtų pasiekiamos GL komandos (pvz. renderText);
void CStateManager::paintGL()
{
    if (currGameState != NULL) { currGameState->draw(this); }
}

// Inicializavimo metodas
void CStateManager::init()
{
    // Kažkokie inicijavimo veiksmai... TBA.
}

// Piešimo metodas (pasiekiamas iš išorės)
void CStateManager::draw()
{
    paintGL();
}

// Lango dydžio keitimo metodas su mastelio išlaikymu
void CStateManager::resizeGL(int width, int height)
{
    glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,width,0,height,-100,100);
    glMatrixMode(GL_MODELVIEW);
    glClearColor(0.0f,0.0f,0.0f,1.0f);
}

// State'o keitimo metodas
//  newState - pointeris į naują state'ą
void CStateManager::setState(CState * newState)
{
    if (currGameState != NULL)
        currGameState->leaveState();

    currGameState = newState;
    currGameState->enterState();
}

// Aktyvaus state'o rodyklės grąžinimas
CState * CStateManager::getState()
{
    return currGameState;
}

// Mygtukų paspaudimai perduodami į aktyvaus state'o paspaudimų apdorojimo metodą
//  Kh - mygtukų hash lentelė
//  Kq - pasp. mygtukų eilė
void CStateManager::handleKeys(QKeyEvent * e, bool isPressed)
{
    if (currGameState != NULL)
        currGameState->handleKeys(e, isPressed, Kh, Kq);
}

// metodas tikrina pelės judėjimą, bei paruošia nuspaustų mygtukų eilę (aktyviame state)
void CStateManager::handleControls()
{
    if (currGameState != NULL)
        currGameState->handleControls(Kl, Kq);
}

// metodas pagrindinei žaidimo logikai apdoroti
int CStateManager::doLogic() {
    if (currGameState != NULL)
        return currGameState->doLogic(Kl);
    return 0;
}

// iškviečiam kiekvieno state'o GL inicijavimo metodą
void CStateManager::st_init()
{
    if (!initialized)
    {
        CState * a;
        foreach(a, this->Sl) a->initGL(this);
        initialized = true;
    }
}
